import axios from 'axios'
import {
  Notification,
  MessageBox,
  Message,
  Loading
} from 'element-ui'
import store from '@/store'
import MD5 from 'md5';
import {
  getToken
} from '@/utils/auth'
import errorCode from '@/utils/errorCode'
import {
  tansParams,
  blobValidate
} from "@/utils/ruoyi";
import cache from '@/plugins/cache'
import {
  saveAs
} from 'file-saver'
import md5 from 'js-md5';


let downloadLoadingInstance;
// 是否显示重新登录
export let isRelogin = {
  show: false
};





//拼接参数
function splicingParameter(data) {
  // console.log('data', data)
  let timestamp = Math.round(new Date().getTime() / 1000).toString()
  let signStr = ''
  let signParams = data
  signParams['timestamp'] = timestamp
  let signParamsKey = Object.keys(signParams).sort();
  for (let i in signParamsKey) {
    if (!tool(signParams[signParamsKey[i]])) {
      if (Array.isArray(signParams[signParamsKey[i]])) {
        signStr += `${signParamsKey[i]}${JSON.stringify(signParams[signParamsKey[i]])}`
      } else if (signParams[signParamsKey[i]].constructor === Object) {
        signStr += `${signParamsKey[i]}${JSON.stringify(signParams[signParamsKey[i]])}`
      } else {
        signStr += `${signParamsKey[i]}${signParams[signParamsKey[i]]}`
      }
    }
  }
  var per = {}


  per.Sign = MD5(encodeURIComponent(encodeURIComponent(signStr)) + 'BQ6lB`Tj+79/]_4gLZteGpi').toUpperCase()
  per.AppKey = process.env.VUE_APP_KEY
  per.AppSign = MD5(process.env.VUE_APP_KEY + MD5(process.env.VUE_APP_SECRET) + timestamp).toUpperCase()
  per.timestamp = timestamp


  return per;
}


function tool(data) {
  if (data === "") { //检验空字符串
    return false;
  } else if (data === "null") { //检验字符串类型的null
    return true;
  } else if (data === null) { //检验null
    return true;
  } else if (data === "undefined") { //检验字符串类型的 undefined
    return true;
  } else if (!data && data !== 0 && data !== "") { //检验 undefined 和 null
    return true;
  } else if (Object.prototype.toString.call(data) === '[object Array]' && data.length === 0) { //检验空数组
    return true;
  } else if (Object.prototype.toString.call(data) === '[object Object]' && Object.keys(data).length ===
    0) { //检验空对象
    return true;
  }
  return false;
}



axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'


// 创建axios实例
const service = axios.create({
  // axios中请求配置有baseURL选项，表示请求URL公共部分
  baseURL: process.env.VUE_APP_TH,
  // baseURL: process.env.VUE_APP_BASE_URL,
  // baseURL: process.env.VUE_APP_BASE_API,
  // 超时
  timeout: 1000000
})



// request(请求)拦截器
service.interceptors.request.use(config => {

  // console.log('请求拦截器111222', config)
  // console.log('getToken', getToken())

  // console.log('222', config.data)

  if (config.data && config.data.type_pj == 1) { //type  1 ,表示调用总后台接口
    var per = splicingParameter(config.data)
    // console.log('666', per)
    config.headers['timestamp'] = per.timestamp
    config.headers['sign'] = per.Sign
    config.headers['AppKey'] = per.AppKey
    config.headers['AppSign'] = per.AppSign



    // console.log('888', config.headers)
    // delete config.data.Sign
    // delete config.data.AppKey
    // delete config.data.AppSign
    // delete config.data.timestamp
    // delete config.data.type_pj

    return config
  } else {

    // 是否需要设置 token
    const isToken = (config.headers || {}).isToken === false
    // 是否需要防止数据重复提交
    const isRepeatSubmit = (config.headers || {}).repeatSubmit === false
    if (getToken() && !isToken) {
      config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
    }

    config.headers['timestamp'] = Date.parse(new Date()) / 1000; //计算时间戳
    config.headers['sign'] = md5("SC." + config.headers['timestamp'] + ".SC").toUpperCase(); //计算签名
    // get请求映射params参数
    if (config.method === 'get' && config.params) {
      let url = config.url + '?' + tansParams(config.params);
      url = url.slice(0, -1);
      config.params = {};
      config.url = url;
    }

    if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
      const requestObj = {
        url: config.url,
        data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
        time: new Date().getTime()
      }
      const sessionObj = cache.session.getJSON('sessionObj')
      if (sessionObj === undefined || sessionObj === null || sessionObj === '') {
        cache.session.setJSON('sessionObj', requestObj)
      } else {
        const s_url = sessionObj.url; // 请求地址
        const s_data = sessionObj.data; // 请求数据
        const s_time = sessionObj.time; // 请求时间
        const interval = 1000; // 间隔时间(ms)，小于此时间视为重复提交
        if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
          const message = '数据正在处理，请勿重复提交';
          console.warn(`[${s_url}]: ` + message)
          return Promise.reject(new Error(message))
        } else {
          cache.session.setJSON('sessionObj', requestObj)
        }
      }
    }
    return config

  }
}, error => {
  console.log(error)
  Promise.reject(error)
})

// 响应拦截器
service.interceptors.response.use(res => {
    // console.log('响应拦截器.src.utils.request', res.data)
    // 未设置状态码则默认成功状态
    const code = res.data.code || 200;
    // 获取错误信息
    const msg = errorCode[code] || res.data.message || errorCode['default']
    // 二进制数据则直接返回
    if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
      return res.data
    }


    const path = window.location.pathname; // 获取当前页面的路径
    const lastSegment = path.substring(path.lastIndexOf('/') + 1); // 截取最后一个后缀
    if (lastSegment) {
      // axios.post(process.env.VUE_APP_BASE_URL + '/system/info')
      axios.post(process.env.VUE_APP_TH + '/system/info')
        .then(response => {
          var userId = localStorage.getItem('user_id')
          if (response.data.data.config_value == 1 && response.data.data.cjkfz.config_value != userId) {
            if (!isRelogin.show) {
              isRelogin.show = true;
              localStorage.clear()
              MessageBox.confirm('系统维护，请稍后登录', '系统提示', {
                showCancelButton: false,
                type: 'warning'
              }).then(() => {
                isRelogin.show = false;
                store.dispatch('LogOut').then(() => {
                  location.href = '/index';
                })

              }).catch(() => {
                isRelogin.show = false;
              });
            }
          }
        })
        .catch(error => {
          isRelogin.show = false;
          console.error(error);
        });
    }





    if (code === 301) {
      if (!isRelogin.show) {
        isRelogin.show = true;
        // localStorage.setItem('username','')
        // localStorage.setItem('avatar','')
        localStorage.clear()
        MessageBox.confirm('登录状态已过期，您可以继续留在该页面，或者重新登录', '系统提示', {
          confirmButtonText: '重新登录',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          isRelogin.show = false;
          store.dispatch('LogOut').then(() => {
            location.href = '/index';
          })
        }).catch(() => {
          isRelogin.show = false;
        });
      }
      return Promise.reject('无效的会话，或者会话已过期，请重新登录。')
    } else if (code === 300) {
      Message({
        message: msg,
        type: 'error'
      })
      return Promise.reject(new Error(msg))
    } else if (code !== 200) {
      Notification.error({
        title: msg
      })
      return Promise.reject('error')
    } else {
      return res.data
    }
  },
  error => {
    console.log('err' + error)
    let {
      message
    } = error;
    if (message == "Network Error") {
      message = "后端接口连接异常";
      Message({
        message: message,
        type: 'error',
        duration: 5 * 1000
      })
    } else if (message.includes("timeout")) {
      message = "系统接口请求超时";
      Message({
        message: message,
        type: 'error',
        duration: 5 * 1000
      })
    } else if (message.includes("Request failed with status code")) {
      message = "系统接口" + message.substr(message.length - 3) + "异常";
    }
    // Message({
    //   message: message,
    //   type: 'error',
    //   duration: 5 * 1000
    // })
    return Promise.reject(error)
  }
)

// 通用下载方法
export function download(url, params, filename) {
  downloadLoadingInstance = Loading.service({
    text: "正在下载数据，请稍候",
    spinner: "el-icon-loading",
    background: "rgba(0, 0, 0, 0.7)",
  })
  return service.post(url, params, {
    transformRequest: [(params) => {
      return tansParams(params)
    }],
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded'
    },
    responseType: 'blob'
  }).then(async (data) => {
    const isLogin = await blobValidate(data);
    if (isLogin) {
      const blob = new Blob([data])
      saveAs(blob, filename)
    } else {
      const resText = await data.text();
      const rspObj = JSON.parse(resText);
      const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
      Message.error(errMsg);
    }
    downloadLoadingInstance.close();
  }).catch((r) => {
    console.error(r)
    Message.error('下载文件出现错误，请联系管理员！')
    downloadLoadingInstance.close();
  })
}

export default service
